SelectDirectory - umiestnenie

Otázka od: Kalus Jozef Ing.

25. 9. 2002 14:26

zdravim,

ked pouzijem na vyber adresara nieco taketo:

SelectDirectory('Vyber cestu:', '', StrDir);

tak mi to mrskne to male okienko kdesi vpravo dole, ale ja by som ho chcel
vycentrovane alebo mu chcel povedat kde ma byt umiestnene a to som akosi
nikde nenasiel, help je velmi strucny

dik za kazde info pripadne nakopnutie  

joka

Odpovedá: Ondrej Kelle

25. 9. 2002 18:06

> ked pouzijem na vyber adresara nieco taketo:
>
> SelectDirectory('Vyber cestu:', '', StrDir);
>
> tak mi to mrskne to male okienko kdesi vpravo dole, ale ja by
> som ho chcel vycentrovane alebo mu chcel povedat kde ma
> byt umiestnene

Cau,
da sa to napriklad takto:

function SelectDirCB(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM):
Integer; stdcall;
var
  R: TRect;
begin
  if (uMsg = BFFM_INITIALIZED) then
  begin
    GetWindowRect(Wnd, R);
    if Assigned(Application) and Assigned(Application.MainForm) then
      with Application.MainForm do
        SetWindowPos(Wnd, HWND_TOP, Left + (Width - (R.Right - R.Left)) div
2,
        Top + (Height - (R.Bottom - R.Top)) div 2, 0, 0, SWP_NOOWNERZORDER
or SWP_NOSIZE or SWP_SHOWWINDOW);
    if (lpData <> 0) then
      SendMessage(Wnd, BFFM_SETSELECTION, Integer(True), lpdata);
  end;
  Result := 0;
end;

function SelectDirectory(const Caption: string; const Root: WideString; var
Directory: string): Boolean;
... kopia z FileCtrl

skratka to iste ako vo FileCtrl, akurat v tej callback funkcii pri sprave
BFFM_INITIALIZED si zmenis polohu toho dialogu.

HTH
TOndrej

Odpovedá: Richard Siegl

26. 9. 2002 9:24

Nazdar

ked je uz debata o SelectDirectory.... neviete niekto ako sa da aby bol uz
nejaky konkretny adresar vybrany ..... zmenou parametra root iba obmedzim
vyberovu strukturu a to nechcem
alebo nejaky vhodnejsi sposob (komponentu) vyberu adresaru ale musi tam byt
k dispozicii aj siet

Rickie

----- Original Message -----
From: "Ondrej Kelle" <O.Kelle@digitalpublishing.de>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, September 25, 2002 3:30 PM
Subject: RE: SelectDirectory - umiestnenie


> > ked pouzijem na vyber adresara nieco taketo:
> >
> > SelectDirectory('Vyber cestu:', '', StrDir);
> >
> > tak mi to mrskne to male okienko kdesi vpravo dole, ale ja by
> > som ho chcel vycentrovane alebo mu chcel povedat kde ma
> > byt umiestnene
>
> Cau,
> da sa to napriklad takto:
>
> function SelectDirCB(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM):
> Integer; stdcall;

Odpovedá: Petr Brant

26. 9. 2002 11:06

Napsal jsem si na to tenhle unit, je tam k dispozici i sit (ale nezobrazi se
sitovy adresar, i kdyz existuje) a pokud existuje adresar InitialDirectory,
struktura se prislusne rozbali.

RNDr. Petr Brant [brant@dcomm.cz]
http://web.redbox.cz/petr.brant
D&COMM s.r.o.
Korunovační 6
Praha 7
tel. +420724007234

unit BrowseDir;

interface
uses
  Windows,
  ShlObj, SysUtils, FileCtrl;

type TBrowseDirectory = class(TObject)
private
  { Private declarations }


public
  { Public declarations }
 function BrowseForDirectory(OwnerWnd:THandle; InitialDirectory: string; var
SelectedDirectory:string):boolean;
end;

implementation
uses ActiveX;

var m_InitialDirectory:string;

function BrowseCallbackProc(Wnd: HWnd; Msg: UINT; lPar: LPARAM; lData:
LPARAM): integer; stdcall;
begin
 Result := 0;
 if (Msg = BFFM_INITIALIZED) and DirectoryExists(m_InitialDirectory) then
    SendMessage(Wnd, BFFM_SETSELECTION, 1, LPARAM(m_InitialDirectory) );
end;


function TBrowseDirectory.BrowseForDirectory(OwnerWnd:THandle;
InitialDirectory: string; var SelectedDirectory:string):boolean;
var BrowseInfo: TBrowseInfo;
    idRoot: PItemIDList;
    Dir: PChar;
    ShellMalloc: IMalloc;
begin
 FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
 if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
 begin
  Dir:= ShellMalloc.Alloc(MAX_PATH);
  try
   m_InitialDirectory:=InitialDirectory;
   BrowseInfo.hwndOwner:=OwnerWnd;
   BrowseInfo.pidlRoot:=idRoot;
   BrowseInfo.lpszTitle:='';
   BrowseInfo.ulFlags:= BIF_RETURNONLYFSDIRS;
   BrowseInfo.lpfn:=BrowseCallbackProc;
   BrowseInfo.pszDisplayName:=Dir;
   idRoot:=ShBrowseForFolder(BrowseInfo);
   Result:=false;
   if idRoot<>nil then
   begin
    SHGetPathFromIDList(idRoot, Dir);
    SelectedDirectory:=string(Dir);
    ShellMalloc.Free(idRoot);
    Result:=(Length(SelectedDirectory)<>0);
   end;
  finally
   ShellMalloc.Free(Dir);
  end;
 end;
end;



end.

 Subject: Re: SelectDirectory - umiestnenie

 Nazdar

 ked je uz debata o SelectDirectory.... neviete niekto ako sa da aby
bol uz
 nejaky konkretny adresar vybrany ..... zmenou parametra root iba
obmedzim
 vyberovu strukturu a to nechcem
 alebo nejaky vhodnejsi sposob (komponentu) vyberu adresaru ale musi
tam byt
 k dispozicii aj siet

 Rickie
 

Odpovedá: Ondrej Kelle

26. 9. 2002 11:50

> ked je uz debata o SelectDirectory.... neviete niekto ako sa
> da aby bol uz nejaky konkretny adresar vybrany

V tom dialogu bude vopred nastavena cesta, ktoru predas pri volani
SelectDirectory v parametri Directory.

> ale musi tam byt k dispozicii aj siet

To tam je tiez.

HTH
TOndrej

Odpovedá: Richard Siegl

26. 9. 2002 15:09

Perfektne ..... mozem ten unit pouzit free .. aj do komercnej aplikacie ???

Rickie

PS : urobil som si upravu ze ked je init dir sietovy tak ho neberiem do
uvahy

----- Original Message -----
From: "Petr Brant" <brant@dcomm.cz>
To: <delphi-l@clexpert.cz>
Sent: Thursday, September 26, 2002 11:04 AM
Subject: RE: SelectDirectory - umiestnenie


Napsal jsem si na to tenhle unit, je tam k dispozici i sit (ale nezobrazi se
sitovy adresar, i kdyz existuje) a pokud existuje adresar InitialDirectory,
struktura se prislusne rozbali.

RNDr. Petr Brant [brant@dcomm.cz]
http://web.redbox.cz/petr.brant
D&COMM s.r.o.
Korunovační 6
Praha 7
tel. +420724007234

unit BrowseDir;

interface
uses
  Windows,
  ShlObj, SysUtils, FileCtrl;

type TBrowseDirectory = class(TObject)
private
  { Private declarations }


public
  { Public declarations }
 function BrowseForDirectory(OwnerWnd:THandle; InitialDirectory: string; var
SelectedDirectory:string):boolean;
end;

implementation
uses ActiveX;

var m_InitialDirectory:string;

function BrowseCallbackProc(Wnd: HWnd; Msg: UINT; lPar: LPARAM; lData:
LPARAM): integer; stdcall;
begin
 Result := 0;
 if (Msg = BFFM_INITIALIZED) and DirectoryExists(m_InitialDirectory) then
    SendMessage(Wnd, BFFM_SETSELECTION, 1, LPARAM(m_InitialDirectory) );
end;


function TBrowseDirectory.BrowseForDirectory(OwnerWnd:THandle;
InitialDirectory: string; var SelectedDirectory:string):boolean;
var BrowseInfo: TBrowseInfo;
    idRoot: PItemIDList;
    Dir: PChar;
    ShellMalloc: IMalloc;
begin
 FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
 if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
 begin
  Dir:= ShellMalloc.Alloc(MAX_PATH);
  try
   m_InitialDirectory:=InitialDirectory;
   BrowseInfo.hwndOwner:=OwnerWnd;
   BrowseInfo.pidlRoot:=idRoot;
   BrowseInfo.lpszTitle:='';
   BrowseInfo.ulFlags:= BIF_RETURNONLYFSDIRS;
   BrowseInfo.lpfn:=BrowseCallbackProc;
   BrowseInfo.pszDisplayName:=Dir;
   idRoot:=ShBrowseForFolder(BrowseInfo);
   Result:=false;
   if idRoot<>nil then
   begin
    SHGetPathFromIDList(idRoot, Dir);
    SelectedDirectory:=string(Dir);
    ShellMalloc.Free(idRoot);
    Result:=(Length(SelectedDirectory)<>0);
   end;
  finally
   ShellMalloc.Free(Dir);
  end;
 end;
end;



end.

Subject: Re: SelectDirectory - umiestnenie

Nazdar

ked je uz debata o SelectDirectory.... neviete niekto ako sa da aby
bol uz
nejaky konkretny adresar vybrany ..... zmenou parametra root iba
obmedzim
vyberovu strukturu a to nechcem
alebo nejaky vhodnejsi sposob (komponentu) vyberu adresaru ale musi
tam byt
k dispozicii aj siet

Rickie


Odpovedá: Richard Siegl

26. 9. 2002 13:51

tak to urcite nie .... to bola prva vec co ma napadla ale nefunguje,
je zajedno ci je v parametry directory nieco nastavene alebo nie vzdy
zobrazi

Rickie
(pouzivam D5 Ent SP1)

----- Original Message -----
From: "Ondrej Kelle" <O.Kelle@digitalpublishing.de>
To: <delphi-l@clexpert.cz>
Sent: Thursday, September 26, 2002 11:32 AM
Subject: RE: SelectDirectory - umiestnenie


> > ked je uz debata o SelectDirectory.... neviete niekto ako sa
> > da aby bol uz nejaky konkretny adresar vybrany
>
> V tom dialogu bude vopred nastavena cesta, ktoru predas pri volani
> SelectDirectory v parametri Directory.
>
> > ale musi tam byt k dispozicii aj siet
>
> To tam je tiez.
>
> HTH
> TOndrej
>

Odpovedá: Ondrej Kelle

26. 9. 2002 16:12

>> V tom dialogu bude vopred nastavena cesta, ktoru predas pri volani
>> SelectDirectory v parametri Directory.

> tak to urcite nie .... to bola prva vec co ma napadla ale nefunguje,
> je zajedno ci je v parametry directory nieco nastavene alebo nie vzdy
> zobrazi

Ak si vsimnes ten riadok v SelectDirCB, co som posielal:

  if (lpData <> 0) then
    SendMessage(Wnd, BFFM_SETSELECTION, Integer(True), lpData);

tam sa to prave deje. Do callbacku sa ako lpData dostane to, co zadas v
TBrowseInfo.lParam.
Takze v SelectDirectory by si tam mal dat PChar(Directory) a callback potom
zariadi, aby bola ta cesta v dialogu pocas jeho inicializacie vybrana. U mna
to v SelectDirectory vyzera takto:

  ...
  if not DirectoryExists(Directory) then
    Directory := '';
  ...
  with BrowseInfo do
  begin
    ...
    if Directory <> '' then
      lParam := PChar(Directory);
  end;
  ...

> (pouzivam D5 Ent SP1)

Ja pouzivam D6 a tam to uz je. Ak to v D5 nemas, mozes si to tam dopisat.

HTH
TOndrej

Odpovedá: Petr Brant

26. 9. 2002 16:31

No jasne... polovina je opsana odnekud z UDDF a druha ze zdrojaku VCL, neco
je taky z nejakeho Cckoveho programu, ne ze bych to vymyslel kompletne cele,
zase tak dobrej nejsem  

RNDr. Petr Brant [brant@dcomm.cz]
D&COMM s.r.o.
Korunovační 6
Praha 7
tel. +420724007234


 Subject: Re: SelectDirectory - umiestnenie

 Perfektne ..... mozem ten unit pouzit free .. aj do komercnej
aplikacie ???

 Rickie

 PS : urobil som si upravu ze ked je init dir sietovy tak ho neberiem
do
 uvahy